package com.junlinpro.utils;


import com.junlinpro.entity.HandMessageEntity;
import com.junlinpro.entity.MessageEntity;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;

public class MessageUtil {

    public static byte[] rtnMessageTobyte(MessageEntity msg) {
        ByteBuf buf = ByteBufAllocator.DEFAULT.buffer();
        // 帧头
        byte[] frameHead = new byte[]{0x4A, 0x4C};
        msg.setFrameHead(frameHead);
        buf.writeBytes(frameHead);
        // 总长度
        buf.writeBytes(ByteUtil.intTo2ByteArray(msg.getAllLen()));
        // 版本号
        String version = msg.getVersionNum();
        String[] versionArr = version.split("\\.");
        buf.writeByte(Byte.valueOf(versionArr[0]));
        buf.writeByte(Byte.valueOf(versionArr[1]));
        // 采集卡编号
        buf.writeBytes(ByteUtil.intToByteArray(msg.getCardId()));
        // 通道号
        buf.writeByte(msg.getChannelId());
        // 命令
        buf.writeByte(msg.getCmd());
        // 帧序号
        buf.writeBytes(ByteUtil.intTo2ByteArray(msg.getFrameId()));
        // 类型
        buf.writeByte(msg.getCardType());
        // UTC时间
        int occurTime = new Long(msg.getOccurTime()).intValue();
        buf.writeBytes(ByteUtil.intToByteArray(occurTime));
        // 数据
        if (msg.getData() != null) {
            buf.writeBytes(msg.getData());
        }
        // crc校验
        byte[] crcData = new byte[buf.readableBytes()];
        buf.getBytes(0, crcData);
        byte[] crcResult = CrcUtils.getCRCValue(crcData);
        buf.writeBytes(crcResult);

        // 帧尾
        byte[] enter = new byte[]{0x0D, 0x0A};
        buf.writeBytes(enter);

        byte[] rtnData = new byte[buf.readableBytes()];
        buf.readBytes(rtnData);

        return rtnData;
    }

    public static MessageEntity newBufToMessage(ByteBuf buf) {
        MessageEntity messageEntity = new MessageEntity();
        // 解析帧头
        byte[] frameHead = new byte[2];
        buf.readBytes(frameHead);
        messageEntity.setFrameHead(frameHead);
        // 解析数据总长度
        byte[] allLen = new byte[2];
        buf.readBytes(allLen);
        messageEntity.setAllLen(ByteUtil.dataLengthToInt(allLen));
        // 解析版本号
        String versionOne = String.valueOf(ByteUtil.byteToInt(buf.readByte()));
        String versionTwo = String.valueOf(ByteUtil.byteToInt(buf.readByte()));
        messageEntity.setVersionNum(versionOne + "." + versionTwo);
        // 解析采集卡编号
        byte[] cardId = new byte[4];
        buf.readBytes(cardId);
        messageEntity.setCardId(ByteUtil.byteArrayToInt(cardId));
        //System.out.println("bufToMessageHead cardId = " + messageEntity.getCardId());
        // 解析通道号
        messageEntity.setChannelId(buf.readByte());
        // 解析命令
        messageEntity.setCmd(buf.readByte());
        // 解析帧序号
        messageEntity.setFrameId(buf.readUnsignedShort());
        // 解析类型
        messageEntity.setCardType(buf.readByte());
        // 解析UTC时间
        messageEntity.setOccurTime(buf.readUnsignedInt());
        // 解析数据区
        // 数据区的数据长度等于总长度减去固定的23位
        int dataLen = messageEntity.getAllLen() - 23;
        if (dataLen != 0) {
            byte[] data = new byte[dataLen];
            buf.readBytes(data);
            messageEntity.setData(data);
        } else {
            messageEntity.setData(null);
        }
        // 解析crc
        byte crcOne = buf.readByte();
        byte crcTwo = buf.readByte();
        byte[] crcArr = new byte[]{crcOne, crcTwo};
        messageEntity.setCrc(crcArr);
        // 解析帧尾
        byte endOne = buf.readByte();
        byte endTwo = buf.readByte();
        byte[] endArr = new byte[]{endOne, endTwo};
        messageEntity.setFrameEnd(endArr);

        return messageEntity;

    }

    public static HandMessageEntity newHandBufToMessage(ByteBuf buf) {

        HandMessageEntity messageEntity = new HandMessageEntity();

        // 解析帧头
        byte[] frameHead = new byte[2];
        buf.readBytes(frameHead);
        messageEntity.setFrameHead(frameHead);
        // 解析数据总长度
        byte[] allLen = new byte[2];
        buf.readBytes(allLen);
        messageEntity.setAllLen(ByteUtil.dataLengthToInt(allLen));
        // 解析版本号
        String versionOne = String.valueOf(ByteUtil.byteToInt(buf.readByte()));
        String versionTwo = String.valueOf(ByteUtil.byteToInt(buf.readByte()));
        messageEntity.setVersionNum(versionOne + "." + versionTwo);
        // 解析采集卡编号
        byte[] cardId = new byte[4];
        buf.readBytes(cardId);
        messageEntity.setCardId(ByteUtil.byteArrayToInt(cardId));
        //System.out.println("bufToMessageHead cardId = " + messageEntity.getCardId());
        // 解析通道号
        messageEntity.setChannelId(buf.readByte());
        // 解析命令
        messageEntity.setCmd(buf.readByte());
        // 解析帧序号
        messageEntity.setFrameId(buf.readUnsignedShort());

        // 解析类型
        messageEntity.setCardType(buf.readByte());
        // 解析UTC时间
        messageEntity.setOccurTime(buf.readInt());

        // 解析数据区
        // 数据区的数据长度等于总长度减去固定的18位
        int dataLen = messageEntity.getAllLen() - 23;
        if (dataLen != 0) {
            // 获得data中的uuid
            byte[] uuidData = new byte[12];
            buf.readBytes(uuidData);
            messageEntity.setUuid(ByteUtil.mac(uuidData));
            int voidLen = dataLen - 12;
            if (voidLen > 0) {
                // 如果是音频数据就解析
                byte[] data = new byte[voidLen];
                buf.readBytes(data);
                messageEntity.setData(data);
            }
        } else {
            messageEntity.setUuid(null);
            messageEntity.setData(null);
        }
        // 解析crc
        byte crcOne = buf.readByte();
        byte crcTwo = buf.readByte();
        byte[] crcArr = new byte[]{crcOne, crcTwo};
        messageEntity.setCrc(crcArr);
        // 解析帧尾
        byte endOne = buf.readByte();
        byte endTwo = buf.readByte();
        byte[] endArr = new byte[]{endOne, endTwo};
        messageEntity.setFrameEnd(endArr);

        return messageEntity;
    }

}
